#include <iostream>
using namespace std;
// g++ -o test_static test_static.cc -std=c++11
class A {
 public:
  A() { cout << "A constructed" << endl; }
  ~A() { cout << "A deconstructed" << endl; }
  void Print1() { cout << a << " " << b << endl; }
  static int Geta() { return a; }
  // static int Getb() { return b; }  // 静态成员函数不能使用非静态成员
  int Getb() { return b; }

  // static int a = 0;  // 编译错误，静态数据成员需要类内声明，类外定义
  static int a;
  int b = 0;
};
int A::a = 10;
void test_static_class() {
  static A a1;
  a1.Print1();
  cout << a1.Geta() << endl;
  cout << a1.Getb() << endl;
  cout << "end of test_static_class" << endl;
}

static int var1 =
    30;  // 作用域和生命周期均为整个程序，只会被初始化一次，存储与静态存储区（全局区）
static void test_static_func() {
  static int var2 =
      20;  // 存储与静态存储区（全局区）,只在第一次进入这个函数时初始化
  var2 += 10;
  cout << var1 << endl;
  cout << var2 << endl;
}
int main() {
  // test_static_class();
  test_static_func();
  cout << "var1= " << var1 << endl;
  // cout << "var2= " << var2 << endl;  //
  // 编译错误，var2的作用域就在test_static_func，只不过它的生命周期延长到了整个程序结束
  test_static_func();
  cout << "end of main" << endl;
  return 0;
}